Модуль:Dates
local monthg = {'января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', "сентября", "октября", "ноября", "декабря"} local monthd = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} local function Yyyymmdd®--Переводит русскую дату в YYYY,MM,DD local d, m, y, M = mw.ustring.match(r, "^%s*(%d%d?)%s+(а-яА-Я+)%s+(%d+)") if not m then return nil end m = mw.ustring.lower(m) --тупо перебор for i = 1, 12 do if m monthgi then M = i break end end if not M then return nil end return tonumber(y), M, tonumber(d) end local p = {} p = { ifdate=function(f)-- Для шаблона "Если дата", имитирует старое поведение -- Аргументы передаются шаблону return f:getParent().args[ mw.ustring.match(frame.args1,"^[ %d.%-−%()]*$") and 2 or 3 ] end; DecodeDate = DecodeDate; Diffy = Diffy; Year0 = Year0; GetDate = GetDate; Cmp = Cmp; Yyyymmdd = Yyyymmdd; diffy = function(f)-- принимает параметры #invoke в виде двух строк-дат local d1,m1,y1=DecodeDate(f.args1); local d0,m0,y0=DecodeDate(f.args2) return Diffy(d1,m1,y1,d0,m0,y0) end; monthg=function(f) return monthg[ f.args1 or f:getParent().args1 ] end;--realmonth persdate=function(f)-- Для шаблона Персона/Дата; }} local frame=f:getParent(); local catpref,mo,d,d2={'Рождения'='Родившиеся','Смерти'='Умершие'}, frame.args1,frame.args2,frame.args3 local cat, j,m,y,oj,om,oy,tail, j2,m2,y2, age = '' if d then j,m,y,oj,om,oy,tail=DecodeDate(d:gsub('−','-')); if not (j or y) then return (frame.args.nocat and d or d..'Category:Википедия:Статьи с ручной викификацией дат в карточке') end end; if d2 then j2,m2,y2 = DecodeDate(d2:gsub('−','-')); end; return table.concat{ FormDate(j,m,y,oj,om,oy,mo), ( (frame.args'nopersoncat' or )~= or (f.args'nocat' or )~= ) and '' or table.concat{ 'Category:Персоналии по алфавиту', j and string.format('Category:%s %i %s',catprefmo,j,monthgm) or , y and string.format('Category:%s в %s',catprefmo,y,Year0(y,'году')) or '' },--/table.concat внутр. (function(F)--возраст if not F then return '' end; local n=F(); return n and string.format(" (%i %s)%s", n, mw.getLanguage('ru'):plural(n,'год','года','лет'), n>150 and 'Category:Википедия:Статьи о персоналиях с большим текущим возрастом' or '' ) or '' end)( ({ 'Рождения'=function() local now=os.date('*t'); if (not d2 or d2 ) and j and m and y then return Diffy(now.day,now.month,now.year,j,m,y) end end, 'Смерти'=function() return j and m and y and j2 and m2 and y2 and Diffy(j,m,y,j2,m2,y2); end, })mo ),--конец вызова функции возраста tail or , cat }--/table.concat внеш. end; formdate=function(f) -- Формирует дату по 3--6 параметрам #invoke или шаблона --не использовать с пустыми аргументами if (f.args1 or '')~= and (f.args2 or )~= or (f.args3 or )~= then return FormDate(f.args1,f.args2,f.args3,f.args4,f.args5,f.args6,f.args'm') else local tf=f:getParent(); return FormDate(tf.args1,tf.args2,tf.args3,tf.args4,tf.args5,tf.args6,tf.args'm') end end; cmp=function(f)--Сравнивает две даты, результат соответственно -1, 0 или 1 return Cmp(f.args1,f.args2) end; G2J=function(f)--перевод григорианских дат в юлианские, возврат DD.MM.YYYY --Не знает про 15 октября 1582 года, не работает до нашей эры и после ???99 года --Если есть второй аргумент, преобразует только ДО этой даты включительно --Если есть третий аргумент, результат форматирует под Персона/Дата local d,m,y=GetDate(f.args1) if f.args2 and Cmp(f.args1,f.args2) 1 then return string.format("%i.%i.%i",d,m,y) end local shift=math.floor(y/100)-math.floor(y/400)-2 if d-shift>0 then return f.args3 and string.format("%i.%i.%i (%i)",d,m,y,d-shift) or string.format("%i.%i.%i",d-shift,m,y) else if m 1 then return f.args3 and string.format("%i.1.%i (%i.12.%i)",d,y,31+d-shift,y-1) or string.format("%i.12.%i",31+d-shift,y-1) elseif m 3 then return f.args3 and string.format("%i.3.%i (%i.2)", d,y, (y%4 0 and 29 or 28)+d-shift-(y%100 0 and y%400~=0 and 1 or 0) ) or string.format("%i.2.%i", (y%4 0 and 29 or 28)+d-shift-(y%100 0 and y%400~=0 and 1 or 0) ,y) else return f.args3 and string.format( "%i.%i.%i (%i.%i)", d,m,y, monthdm-1+d-shift,m-1 ) or string.format("%i.%i.%i",monthdm-1+d-shift,m-1,y) end end end; -- Переводит русскую дату в YYYY/MM/DD. Возвращает входное значение, если дата уже в этом формате yyyymmdd = function(f) local date, hourmin = f.args1 if mw.ustring.match(date, "^%s*%d+\-%d+\-%d+") then return date end hourmin = mw.ustring.match(date, "%s+%d+:%d+$") local y, m, d = Yyyymmdd(date) if not y then return 'Ошибка: некорректный формат даты.' end return string.format('%02i/%02i/%4i', m, d, y) .. (hourmin or '') end } return p